home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 722 / 722.xpi / chrome / noscript.jar / content / noscript / ScriptSurrogate.js < prev    next >
Text File  |  2010-02-12  |  5KB  |  142 lines

  1. var ScriptSurrogate = {
  2.   QueryInterface: xpcom_generateQI([CI.nsIObserver, CI.nsISupportsWeakReference, CI.nsISupports]),
  3.   
  4.   enabled: true,
  5.   prefs: null,
  6.   
  7.   get mappings() {
  8.     delete this.mappings;
  9.     this._init();
  10.     return this.mappings;
  11.   },
  12.   
  13.   
  14.   _init: function() {
  15.     this.prefs = CC["@mozilla.org/preferences-service;1"].getService(CI.nsIPrefService)
  16.       .getBranch("noscript.surrogate.").QueryInterface(CI.nsIPrefBranch2);
  17.     this._syncPrefs();
  18.     this.prefs.addObserver("", this, true);
  19.   },
  20.   
  21.   _syncPrefs: function() {
  22.     const prefs = this.prefs;
  23.     this.enabled = prefs.getBoolPref("enabled");
  24.     this.mappings = {};
  25.     for each(var key in prefs.getChildList("", {})) {
  26.       this._parseMapping(prefs, key);
  27.     }
  28.   },
  29.   
  30.   _parseMapping: function(prefs, key) {
  31.     var keyParts = key.split(".");
  32.     var name = keyParts[0];
  33.     var member = keyParts[1];
  34.     if (!(name && member)) return;
  35.     try {
  36.       var value = prefs.getCharPref(key);
  37.       if (!value) return;
  38.       var mapping = (name in this.mappings) ? this.mappings[name] : this.mappings[name] = { forPage: false };
  39.       switch(member) {
  40.         case "sources":
  41.           if ((mapping.forPage = value[0] == '@')) value = value.substring(1);
  42.         case "exceptions":
  43.           value = new AddressMatcher(value);
  44.         case "replacement":
  45.           break;
  46.         default:
  47.           return;
  48.       }
  49.       
  50.       mapping[member] = value; 
  51.     } catch (e) {}
  52.   },
  53.   
  54.   observe: function(prefs, topic, key) {
  55.     this._syncPrefs();
  56.   },
  57.   
  58.   _resolveFile: function(fileURI) {
  59.     const profileURI = IOS.newFileURI(
  60.       CC["@mozilla.org/file/directory_service;1"].getService(CI.nsIProperties)
  61.       .get("ProfD", CI.nsIFile));
  62.     return (this._resolveFile = function(fileURI) {
  63.       return profileURI.resolve(fileURI);
  64.     })(fileURI);
  65.   },
  66.   
  67.   getScripts: function(scriptURL, pageURL) {
  68.     var mapping;
  69.     var scripts = null;
  70.     var isPage = scriptURL == pageURL;
  71.     var code;
  72.     for (var key in this.mappings) {
  73.       mapping = this.mappings[key];
  74.       if (isPage == mapping.forPage && mapping.sources && mapping.sources.test(scriptURL) &&
  75.           !(mapping.exceptions && mapping.exceptions.test(pageURL)) &&
  76.           mapping.replacement) {
  77.         if (/^(?:file:\/\/|\.\.?\/)/.test(mapping.replacement)) {
  78.           try {
  79.             code = IO.readFile(IOS.newURI(this._resolveFile(mapping.replacement), null, null)
  80.                                .QueryInterface(CI.nsIFileURL).file);
  81.           } catch(e) {
  82.             ns.dump("Error loading " + mapping.replacement + ": " + e);
  83.             continue;
  84.           }
  85.         } else code = mapping.replacement;
  86.         (scripts = scripts || []).push(code);
  87.       }
  88.     }
  89.     return scripts;
  90.   },
  91.   
  92.   getScriptBlock: function(scriptURL, pageURL) {
  93.     var scripts = this.getScripts(scriptURL, pageURL);
  94.     return scripts && "try { (function() {" + scripts.join("})(); (function() {") + "})(); } catch(e) {}";
  95.   },
  96.  
  97.   apply: function(document, scriptURL, pageURL) {
  98.     if (!this.enabled) return;
  99.     var scriptBlock = this.getScriptBlock(scriptURL, pageURL);
  100.     if (scriptBlock) {
  101.       this.execute(document, scriptBlock, scriptURL == pageURL);
  102.     }
  103.   },
  104.   
  105.   
  106.   execute: function(document, scriptBlock, isPageScript) {
  107.     if (this._mustUseDOM && document.documentElement) {
  108.       var s = document.createElementNS(HTML_NS, "script");
  109.       s.id = "__noscriptSurrogate__" + DOM.rndId();
  110.       s.appendChild(document.createTextNode(scriptBlock +
  111.         ";(function(){var s=document.getElementById('" + s.id + "');s.parentNode.removeChild(s);})()"));
  112.       document.documentElement.insertBefore(s, document.documentElement.firstChild);
  113.       if (this._mustResetStyles && isPageScript) this._resetStyles();
  114.     } else {
  115.       document.defaultView.location.href = encodeURI("javascript:" + scriptBlock);
  116.     }
  117.   },
  118.   
  119.   get _mustUseDOM() {
  120.     delete this._mustUseDOM;
  121.     return this._mustUseDOM = ns.geckoVersionCheck("1.9") >= 0;
  122.   },
  123.   
  124.   get _mustResetStyles() {
  125.     delete this._mustResetStyles;
  126.     return this._mustResetStyles = ns.geckoVersionCheck("1.9.1") < 0;
  127.   },
  128.   
  129.   get _emptyStyle() {
  130.     delete this._emptyStyle;
  131.     return this._emptyStyle = IOS.newURI("data:text/css;charset=utf8,", null, null);
  132.   },
  133.   
  134.   _resetStyles: function() {
  135.     const sss = ns.sss;
  136.     const SHEET = sss.AGENT_SHEET;
  137.     sss.loadAndRegisterSheet(this._emptyStyle, SHEET);
  138.     sss.unregisterSheet(this._emptyStyle, SHEET)
  139.   }
  140.  
  141.   
  142. }